Prefetch paths are build using Prefetch path element objects (the objects created by the generated methods in the entity classes). These are added to PrefetchPath(2) instances to build a tree (e.g. by adding them to the PrefetchPath(2) instance returned by SubPath())
The only thing that's required is that a prefetch path element is compatible with the entity type of the PrefetchPath(2) instance it is added to.
So if you create a path by doing:
PrefetchPath2 path = new PrefetchPath(EntityType.CustomerEntity);
you can then add prefetch path elements (e.g. CustomerEntity.PrefetchPathOrders) which are meant for Customer, so which describe how to fetch entities related to Customer.
If I then do:
IPrefetchPathElement2 orderElement = path.Add(CustomerEntity.PrefetchPathOrders);
I have access to a new container, namely orderElement.SubPath(). This routine returns a PrefetchPath2 instance which is for OrderEntity, and which accepts prefetch path element instances which are meant for Order and which describe how to fetch entities related to Order.
As long as you don't break this pattern, you can move around the path elements freely. Every path element is fetched separately, with the help of the parent elements. I'm not sure what you meant with 'the prefetch path for customer and the prefetch path for order', as a prefetch path is always from a root element (in my example above 'Customer') to sub elements. You werent' very clear in your startpost, as you simply described classes with paths but what these paths look like is unclear.
So if you have two prefetch paths, e.g. Customer -> Order and Order -> OrderDetails, you can add the Order -> OrderDetails path as the path from Order in Customer -> Order, by adding the Order element of Order->OrderDetails to the SubPath() path container of Order in Customer -> Order. As long as you add elements meant for entity E to a PrefetchPath(2) instance meant for E, you're fine.
Keep in mind that adding path element instances multiple times to the same path is not going to work. That's also why the elements returned from the static properties aren't cached, but re-created every time. The reason is that the data fetched for that element is stored inside the element till it's merged into the parent's data.