この投稿は何年も前のものですが、同じ問題に遭遇し、解決策があります。 DataTable を使用せず、代わりに SqlDataRecord のコレクションを作成する場合は、SqlDataRecord のデータ型を SqlDbType.Variant に設定できます。
List<SqlDataRecord> dataTable = new List<SqlDataRecord>();
var dr = new SqlDataRecord(
new SqlMetaData("Id", SqlDbType.Int),
new SqlMetaData("Value", SqlDbType.Variant));
dr.SetInt32(0, id);
dr.SetValue(1, myObject);
dataTable.Add(dr);
[...]
SqlCommand sqlCommand = new SqlCommand("dbo.MyProc");
var structuredParam = sqlCommand.Parameters.Add("myTableParam", SqlDbType.Structured);
structuredParam.Value = dataTable;