Crear dinámicamente objetos anónimos a partir de valores de lista c #

Tengo una lista (o puede ser una matriz) de cadenas a partir de las cuales quiero crear dinámicamente un objeto anónimo. ¿Cómo hago esto?

var dataSet = new DataSet();
dataSet.ReadXml(@"");
var dataTable = dataSet.Tables[0];
var dataRow = dataTable.Rows[0];    

var keys = new List<string> {"Column1","Column2"};
var result = new {keys[0] = dataRow[keys[0]], keys[1] = dataRow[keys[1]]}

De modo que esa lista llamada "claves" se creará fuera de este método y puede contener de 1 a muchos valores. Intenté crear un diccionario y recorrer la lista y agregar pares clave / valor al diccionario, pero luego no pude descubrir cómo convertir el diccionario a un tipo anónimo. También experimenté con los objetos de expansión, pero eso no pareció llevarme más lejos.

Debo poder devolver un tipo anónimo, ya que el resultado de este método se usará con la cláusula GroupBy de una consulta LINQ.

Aquí está el método que tuve para crear dinámicamente el diccionario:

    public object Key(DataRow dataRow, List<String> keys)
    {
        var dictionary = new IDictionary<string, object>;
        foreach (string key in keys)
        {
            dictionary.Add(key, dataRow[key]);
        }
        return dictionary;
    }

Aquí está mi consulta LINQ:

var duplicates = dataTable.AsEnumerable().GroupBy(r => Key(r, keys)).Where(c => c.Count() > 1).ToList();

La cláusula GroupBy funciona si codifico de forma anónima desde el método Key (). Básicamente, solo necesito que la cláusula GroupBy se establezca dinámicamente en función de los valores en la lista de claves.

Respuestas a la pregunta(1)

Su respuesta a la pregunta