Method to return date ranges of 1 year
If you perform all calcuclations dynamically your method becomes a simple few lines long loop:

private IEnumerable&lt;DateTimeRange&gt; GetYearsBetweenDates(DateTime startDate, DateTime stopDate)
{
    for (int i = startDate.Year; i &lt;= stopDate.Year; i++)
    {
        yield return new DateTimeRange
        (
            start: new DateTime(i, startDate.Month, startDate.Day),
            end:
             i == stopDate.Year 
             ? new DateTime(i, stopDate.Month, stopDate.Day).AddYears(1) 
             : new DateTime(i, startDate.Month, startDate.Day).AddYears(1)
        );
    }
}


So what I have I changed?

The method returns an IEnumerable&lt;T&gt; and uses the yield return which makes it deferred (this means it is executed only if enumerated).

The T is a new struct that is easier to understand than a Tuple:

struct DateTimeRange
{
    public DateTimeRange(DateTime start, DateTime end)
    {
        Start = start;
        End = end;
    }
    public DateTime Start { get; }
    public DateTime End { get; }
}


To get all dates you call it with ToList or ToArray

var dates = GetYearsBetweenDates(startDate, endDate).ToList();


or you put it in a foreach loop

foreach(var range in GetYearsBetweenDates(startDate, endDate))
{
    // do something
}




You can also exagerate and make it pure LINQ method without any manual loop but personaly I think the for loop looks better:

private IEnumerable&lt;DateTimeRange&gt; GetYearsBetweenDates3(DateTime startDate, DateTime stopDate)
{
    return Enumerable.Range(startDate.Year, stopDate.Year - startDate.Year + 1)
        .Select(x =&gt; new DateTimeRange
        (
            start: new DateTime(x, startDate.Month, startDate.Day),
            end:
             x == stopDate.Year 
             ? new DateTime(x, stopDate.Month, stopDate.Day).AddYears(1) 
             : new DateTime(x, startDate.Month, startDate.Day).AddYears(1)
        ));
}




What else?


var list = new List&lt;Tuple&lt;DateTime, DateTime&gt;&gt;();



You should always choose meaningful names for all variables. You did it well for the others. This could have been results or dates.


var oneYear = TimeSpan.FromDays(365);



It's safer to use the AddYear(1) method rather then hardcoding the number. Especially if you don't want to care about leapyears.