The problem is that you are not clearing the DGV down each time. You must have selected March on a previous run (31 days) and then April (30 days) so the last day in March is not being overwritten by the new month.
Use
DGVCalendar.Rows.Clear();
before the while loop after the
int numDays ...
Of course the number of rows will now always be zero so you can tidy up the
if
statement immediately after that as well