using either dynamic SQL or some type of CASE structure
Yes, these are typically the solution. The solution with CASE breaks down quite quickly if you want to sort by more than one column, since you need keep different data types in different CASE expressions.
The other alternative is to sort in the client.