I'm afraid that there's something wrong with your sample data. However, you could do something like this.
SELECT productdate,
MAX(CASE WHEN personname = 'Jasper' THEN productname END) Jasper,
MAX(CASE WHEN personname = 'Milo' THEN productname END) Milo
FROM @OrderDetail
GROUP BY productdate
If you want to make it dynamic, please check the following articles
Cross Tabs and Pivots, Part 1 – Converting Rows to Columns[/url]