Você não pode passar o nome da tabela como parâmetro. Você tem que usar SQL dinâmico para fazer isso, então você tem que fazer concentração de string para fazer isso, por exemplo
MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)
Mas como os usuários inserem o tableName, a injeção de SQL é possível. Você pode usar esse SQL para determinar se essa tabela existe antes de consultar qualquer coisa dela:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';
(Você pode parametrizar perfeitamente esta consulta, então a injeção de SQL será eliminada)
Geralmente, tenha cuidado com a injeção de SQL. Mas se você usar isso interno (não expor ao usuário), então a injeção de SQL não deve ser problema.
Melhor, você pode construir um procedimento armazenado para lidar com isso, como na minha outra resposta:
Getter SQL unificado com LINQ