1. Create a NavMeshLink between the boat stations (make you the area type has quite a big “weight”, otherwise, all your agents will want to take the boat)
2. Detect when the agent reaches the 1st boat station,
3. Define the positions of the queue in an array (struct of Transform / Vector3 + bool to indicate free/occupied) and change the navmesh agent destination to the front-most free location
4. Pause the navmesh agent
5. When the boat arrives (using triggerfor instance), resume X navMeshAgents and make them board (animation / navmesh)
6. Move the N - X other agents to the frontmost queue position
7. Move the boat to 2nd boat station
8. Make the X agents land on the Navmesh and set back their destination to their initial one (B)
For your problem mentionned on your 5th point, keep in mind that you can have navmesh surfaces baked using gameObjects in a layer which is not rendered by the camera.