Виждам, че слагаш картите в HashSet, след това ги пресмяташ и ако има човек с такова име му добавяш стойността...
Защо не опиташ всеки играч в Речника Value-то му да бъде не сбора от карти а HashSet от картите които има, това ще ти гарантира, че от всички инпути, няма да има повтаряща карта.
След това при принтирането си пресмяташ сбора.
ПП Не съм решавал задачата и я погледнах туку що, възможно е да не съм доразбрал нещо по условието, но не прече да пробваш :)
Гърми ти при първата 10ка. На cardPower[card[0].ToString()] * cardType[card[1].ToString()]; подаваш card[0], което при card = "10S" e 1. "1" го нямаш в cardPower речника като ключ и оттам ти хвърля 'System.Collections.Generic.KeyNotFoundException'.
Надявам се да ти помогне това да подкараш твоето решение :) Ако имаш нужда от примерно решение само с един речник може да погледнеш това https://pastebin.com/gEuwxzk8
EDIT: Пробвай ето https://pastebin.com/mKDnDqgb Със Substring вече не гърми, но има грешка при изчисленията, защото не връща правилен отговор за последните двама играчи.