Kokoness showed you the answer in his post.
And WHY do you get the value out of the database *AS A STRING* if it's a DateTime value there???
foreach (DataRow r in ds.Tables.Rows)
DateTime dt = r["First_Resurvey_Date"]; // do NOT convert it to string and then BACK to datetime!
NotesLabel.Text = td.ToString("dd-MMM-yy");
Though why you would loop through all the rows and, in each row, set just the one label to the date, I don't get, at all.
I suspect that all you need is code to change the display of the value from the datatable *during* the binding to the datagrid. No?
But if you don't know how to do that, then maybe the right answer is to change your SQL query to get the date *AS A STRING* from Access.
SELECT Right('0' & Day(yourfield),2) & '-' & MonthName(Month(yourfield),True) & '-' & Right(CStr(Year(yourfield)),2) AS formattedDate, ...