I think this should do it:
LOAD *, If(Len(Todate)=0,Today(), Todate) As To_date;
LOAD * INLINE [
Cardnumber, Fromdate, Todate, Employee
12345, 01-08-2010, 14-11-2010, Pete
12345, 15-11-2010, 20-08-2014, Hank
12345, 21-08-2014, , Jill
01982, 01-08-2010, , Kate
01231, 01-08-2010, 10-07-2014, Jim
MonthStart(AddMonths(Fromdate,IterNo()-1)) & '-' & Cardnumber As Header1,
Employee as Header2
RESIDENT Source While AddMonths(Fromdate,IterNo()-1) < To_date;
In the source load, I add a field To_date that adds the current date if Todate is missing, to cover the ones that are still open (Jill & Kate). Just to make the check easier in next step. You may need to adapt this depending on your data source if you receive Null values.
The Monthly load is an iterative load. It reads each source record several times, until the condition is met (While AddMonths(Fromdate,IterNo()-1) < To_date). Then it moves on to next record/employee. The IterNo() function keeps track of which loop you are in.