Динамически создавать анонимный объект из списка значений c #

У меня есть список (или может быть массив) строк, из которых я хочу динамически создать анонимный объект. Как мне это сделать?

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]]}

Таким образом, список с именем «keys» будет создан вне этого метода и может содержать от 1 до многих значений. Я попытался создать словарь и пройтись по списку и добавить пары «ключ-значение» в словарь, но потом не мог понять, как преобразовать словарь обратно в анонимный тип. Я также экспериментировал с объектами экспандо, но это, похоже, не дало мне ничего большего.

Я должен быть в состоянии вернуть анонимный тип, так как результат этого метода будет использоваться с предложением GroupBy запроса LINQ.

Вот метод, который я должен был динамически создать словарь:

    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;
    }

Вот мой запрос LINQ:

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

Предложение GroupBy работает, если я жестко закодировал анонимный тип из метода Key (). По сути, мне просто нужно, чтобы предложение GroupBy было динамически установлено на основе значений в списке ключей.