As per MSDN, SqlDataReader.GetSchemaTable returns column metadata for the query executed. I am wondering is there a similar method that will give table metadata
Actually, you can. See my answer here: https://stackoverflow.com/a/19537164/88409
What you'll have to do is run all your static queries once with set showplan_xml on, parse the returned XML, and the very first you find will be the top-level output columns. As long as you assign an alias to the tables in your queries when they are first referenced, those aliases will carry through to the output column.
To go even further, I would have to surmise that such aliases CANNOT be optimized out, because the engine would have to use them to differentiate between different instances of the same column from the same table.
In fact, if you run a query like this: select * from Lessons, Lessons, the engine basically tells you as much with the message:
"The objects "Lessons" and "Lessons" in the FROM clause have the same exposed names. Use correlation names to distinguish them."
For example, if you run something like 'set showplan_xml on; select * from Lessons a, Lessons b, Lessons c, (select * from Lessons d) subquery_aliases_wont_stick_like_table_aliases`
You'll get output like this: