Я думаю, что большинство людей предположили бы, что "один год с 29.02.leapX равен 01.03.leapX + 1".
Я бы не стал. Я обычно ожидал бы усечение. Это в основном похоже на добавление одного месяца к 30 января - я ожидаю получить последний день февраля. В обоих случаях вы добавляете «большую единицу» (месяц или год), а «меньшая единица» (день) усекается, чтобы соответствовать комбинации год / месяц.
(Вот как Joda Time и Noda Time тоже ведут себя, кстати.)
Как отметил Тим в комментариях, задокументировано тоже так:
Метод AddYears вычисляет итоговый год с учетом високосных лет. Часть месяца и времени дня получающегося объекта DateTime остается такой же, как этот экземпляр.
Таким образом, месяц должен остаться как февраль; очевидно, что год будет меняться в зависимости от того, сколько лет добавляется, поэтому день должен измениться, чтобы оставаться действительным.