Вы можете сгруппировать элементы, используя анонимный тип, и создать словарь с группами:
var grouped = items.GroupBy(item => new { item.Key1, item.Key4 })
.ToDictionary(g => g.Key, g => g.ToList());
Однако анонимные типы могут использоваться только для локальных переменных (или общих параметров метода), поэтому, если вы собираетесь хранить словарь для последующего повторного использования, вам потребуется неанонимный тип. Таким образом, вы можете создавать типы для каждой возможной комбинации клавиш или использовать класс Tuple
:
Dictionary<Tuple<int, int>, Item> grouped =
items.GroupBy(item => Tuple.Create(item.Key1, item.Key2))
.ToDictionary(g => g.Key, g => g.ToList());