for (int x = i; curD2.Day == curD3.Day; x++)

это цикл является вечным, т.к. ни curD2, ни curD3 в цикле не изменяются. В итоге, объекты в список добавляются, пока не кончается память.