Don't do that
You really shouldn't be modifying table schema at runtime. All sorts of things can go wrong. You could have someone try to create a column that turns out to be a reserved word. The access you are giving the user to be able to do these changes allows for things like dropping tables too.
You really shouldn't be modifying table schema at runtime. It means you are not using much of what a database is good at.
Try an EAV table structure instead
If you are going to be writing dynamic data where columns change and are arbitrarily created, consider using an EAV table structure instead. It is well known and understood how it works.
Yes, various DBAs and purists will fuss at at it, but will you suggest your proposed solution of adding columns at runtime, they will probably give in. You can even find libraries that will let you write a model for it (such as EAV @ CodePlex).
Maybe try something out of NoSQL
Maybe you don't want a relational database at all. Maybe you want something that has a document model and you're just sticking json in there. Then mongo or couch would work acceptably. Or maybe you want a column oriented database like Cassandra. I'm not sure, but its something to explore if you really are after that 'creating columns at runtime' type thought.
Ok, you're really doing that
You can get the metadata from a table back. In the Java world, this would be something like ResultSetMetaData which lets you find out the specifics of all of the columns, the types of data they store and other bits about it.
In C#, apparently this is stored in the DataColumn class. From Retrieving metadata (table name) from a SQL statement on Stack Overflow:
SqlConnection con = new SqlConnection(connString);
String queryString = "Select CUSTOMER_NAME from CUSTOMER_DETAIL";
SqlCommand cmd = new SqlCommand(queryString, con);
DataTable myTable = new DataTable();
myTable.Load(cmd.ExecuteReader());
DataColumn column = myTable.Columns[0];
// zero based index of column, alternatively use column name
string typeOfColumn = column.DataType.Name;
// or column.DataType.FullName to get the fully qualified name of the System.Type