In order for a query to be efficient, the engine needs to know precisely what columns the query is about to return, because the query plan may greatly depend upon it.
With structures like CASE, there's a certain level of dynamicity in the query, but the query planner can still have an idea about what columns may need to be retrieved in one case or another before the query is executed. With a truly dynamic approach, when a column name is supposed to be retrieved from another column, variable or query parameter, it would be extremely difficult, if ever possible, to come up with a really efficient query plan.
So, you really need to let the query planner know about the required data at the time of compiling the query. Therefore, either use CASE/inline IF/what-have-you, or return both columns and choose between the two in the calling application as necessary.