Hi Mollie!
Our company doesn't use program reports, so I'm not super familiar with how they work, but I can speak to the project-level calculated field. I think this formula should work for what you need:
DMAX(Program.Name of Field,Program.Name of Field,Program.Name of Field)
To explain the formula:
The DMAX formula returns the latest date in the list
Program specifies that the custom field lives under the object "Program"
Each occurrence of Name of Field should be replaced with the name(s) of the program custom field you want to use.
Just keep in mind, Name of Field should be the label of the field, not the usual API version with "DE:Custom Field Name". So for example, if you have a custom field called Program Date A, in reporting, you'd usually write DE:Program Date A, but in calculated fields, you just need to write Program Date A.