You were correct - it did sort incorrectly. I made my dates YYYYMMDD using this code:
WHEN 'due_date' THEN LTRIM(STR(DATEPART(yyyy,a.due_date))) +
RIGHT('00'+LTRIM(STR(DATEPART(mm,a.due_date))),2) +
RIGHT('00'+LTRIM(STR(DATEPART(dd,a.due_date))),2)
Everything looks like it is working fine now including date sorting. Excellent way to contruct some dynamic clauses without dynamic SQL!