I submitted a pull request that handles this (passing tables as parameters). This involved creating a new NHibernate IType (StructuredType) and SqlType (StructuredSqlType).
Because the SQL Server's implementation needs to take the name of the type (table-valued parameter), I propose the following convention: set the type as the DataTable name, as in:
var table = new DataTable("dbo.TableType");
table.Columns.Add("a", typeof (int));
table.Columns.Add("b", typeof(int));
table.Rows.Add(1, 2);
var result = session.CreateSQLQuery("EXEC dbo.TableProcedure :t").SetParameter("t", table).List();
The type must be passed, there is no other way. The only way I see is to explicitly pass the type as a parameter, which is also supported:
var result = session.CreateSQLQuery("EXEC dbo.TableProcedure :t").SetParameter("t", table, NHibernateUtil.Structured("dbo.TableType")).List();