У вас методы Equals(...) сравнивают только ID, а метод GetHashCode() возвращает хеш от ID и Name. Решите точно, когда вы считаете, что объекты равны: когда оба параметра равны или когда только ID равны, и укажите их в Equals(...) и GetHashCode(). И вот
эту статью тоже полезно прочитать.
Update:
Пока ковырялся в декомпиленных дебрях .NET, вы тут уже разобрались - я несколько опоздал :)