SingleOrDefault возвращает объект, если он найден или равен нулю. Итак, в вашем случае он возвращает всех сотрудников, потому что вы ничего не тестируете. Вы только что сказали, что если проект есть, верните его.
Вместо этого используйте Any, который будет возвращать логическое значение, если существует или нет:
var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Any(p => p.Key == projectKey));
Если вам нужно отфильтровать, если у него есть только один проект с определенным ключом:
var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Count(p => p.Key == projectKey) == 1);
Вы также можете достичь этого с помощью SingleOrDefault, но протестируйте значение с нулем:
var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.SingleOrDefault(p => p.Key == projectKey) != null);
Если вы хотите, чтобы тип возвращаемого значения был более конкретным, используйте select.
Если это не сработало, попробуйте добавить «include» в список:
list.Include("Projects").... the rest of the query