No puede pasar el nombre de la tabla como parámetro. Debe usar SQL dinámico para hacer esto, por lo que debe concentrarse para hacerlo, por ejemplo
MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)
Pero debido a que los usuarios ingresan el nombre de la tabla, es posible la inyección de SQL. Puede usar este SQL para determinar si esa tabla existe antes de consultar algo de ella:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';
(Puede parametrizar perfectamente esta consulta, por lo que se eliminará la inyección de SQL)
En general, tenga cuidado con la inyección de SQL. Pero si usa esto interno (no lo expone al usuario), entonces la inyección de SQL no debería ser un problema.
Mejor, puede construir un procedimiento almacenado para lidiar con esto, como en mi otra respuesta:
Obtener SQL unificado con LINQ