Каждый объект .Net реализует интерфейс IComparer и имеет собственную реализацию метода CompareTo..Net просто использует этот метод, чтобы определить, является ли что-то равным, в этом случае .net просто проверяет, имеют ли открытые свойства обоих объектов одинаковые значения, следовательно, они равны.
РЕДАКТИРОВАТЬ: Извините, я путаю IComparer CompareTo сobject.Equals, каждый объект реализует метод Equals и, в качестве примера, класс String переопределяет этот метод и просто проверяет, что обе строки содержат одно и то же значение, не ссылаясь на один и тот же адрес памяти.