There are several ways you can structure this. One that is already mentioned is for Project to have a lookup to the Program list. Another is for each program to have a multi-valued lookup pointing to each project that "belongs" to it. You could also do both (not suggested, as they could get out of sync). A final option would be to have a 3rd list that defines the relationship between Projects and Programs; it would be a list with two columns, a lookup to Project and a lookup to Program.
The question of which option is best is going to be partially based on how you plan to use these lists. Which types of queries do you see yourself asking more often:
- What is the program for this project?
- What are all of the projects for this program?
The first is more efficiently asked with the first option I presented to you, the second is more efficiently asked with the second option I presented to you. If you are frequently asking both questions then the 3rd option would be more efficient, but it would also take more time and effort anytime items were added, created, or when the relationship changes. If the data is largely static and just queried a lot this might be a good option, but if it's changing a lot it will be much harder to maintain.
The last option I presented is going to be less efficient for most of these queries, at least most of the time. It's primary advantage is that it allows for a many to many relationship, rather than just a one to one relationship. It also separates the relationship from the content of the items, so if you are usually querying for information just about the relationship between the lists then this could be a worthwhile choice.