Сортировка происходит с использованием делегата / класса, который может сравнивать двух человек - вам не нужно сравнивать их по одному атрибуту. Например
People.Sort((p1,p2)=>scoreFunc(p1)-scoreFunc(p2));
EDIT:
Если вы хотите отсортировать весь список по количеству баллов, то это будет единственный способ (вы можете изменить алгоритм сортировки, но сравнение не изменится, потому что счет - это ключ сортировки). Теперь выше, вероятно, будет вычислять счет для некоторых людей несколько раз - поэтому одной из оптимизаций может быть кэширование оценки человека. Например, ScoreFunc может проверить в кэше (словаре), чтобы увидеть, была ли оценка уже вычислена или нет.
Дальнейшая оптимизация может происходить на основе ваших реальных требований и реализации функции скоринга. Например, предположим, что у вас есть 10000 человек, и вы, вероятно, интересуетесь топ-20. Предположите, что возраст и образовательные квалификации этого человека составляют основную часть баллов, в то время как есть 20 других атрибутов, которые вносят незначительный вклад. Таким образом, вы можете выполнить многопроходную сортировку - первый проход может использовать оценку, основанную только на двух факторах, для определения, скажем, 500 лучших, а затем вы применяете подробный подсчет, чтобы получить реальный 20 лучших.