Since this is only to link the Opps together, and other project data points are stored elsewhere, it sounds like you can create a lookup(Opportunity) field on the Opportunity and this will meet your requirements, and allow the child Opps ('20 beds' and '10 wheelchairs') lookup to the parent Opp ('New hospital wing'). This effectively limits you to a one-to-many relationship. If you go this route, keep this in mind.
If however, you anticipate needing a many-to-many relationship (as you mentioned in #2), I recommend creating a new object that functions as a junction, with two lookup(Opportunity) fields. It doesn't have to be many-to-many, as you could add logic enforce a one-to-many relationship. You may also want to define layouts for the parent and child Opps so that you can add the corresponding related lists.