SQL dinâmico é a única maneira de fazer isso, mas eu reconsideraria a arquitetura do seu aplicativo se isso exigir. SQL não é muito bom em código "generalizado". Funciona melhor quando é projetado e codificado para realizar tarefas individuais.
Selecionar da TabelaA não é o mesmo que selecionar da TabelaB, mesmo que as instruções select tenham a mesma aparência. Pode haver diferentes índices, diferentes tamanhos de tabela, distribuição de dados, etc.
Você pode gerar seus procedimentos armazenados individuais, que é uma abordagem comum. Tenha um gerador de código que crie os vários procedimentos armazenados selecionados para as tabelas que você precisa. Cada tabela teria seu(s) próprio(s) SP(s), que você poderia então vincular ao seu aplicativo.
Eu escrevi esses tipos de geradores em T-SQL, mas você pode fazer isso facilmente com a maioria das linguagens de programação. São coisas bem básicas.
Só para adicionar mais uma coisa, já que Scott E trouxe os ORMs... você também deve ser capaz de usar esses procedimentos armazenados com os ORMs mais sofisticados.