You're most of the way there in the comment with the handling of multiple sources and destinations. The simple way to do it is to insert two new vertices: the new source, with a 0-weight edge to each of the multi-sources, and the new destination, with a 0-weight edge from each of the multi-destinations.
For the waypoints, I will quote myself:
This is one of a class of similar problems which can all be handled by deriving a graph $G' = (V', E')$ from the original graph $G = (V, E)$ and then using the standard algorithm on $G'$.
Consider that at any point in your search in $G'$ you need the path information you would have at a corresponding point in the search in $G$ plus the knowledge of ...
here, the knowledge of which waypoints you've already visited. So $G'$ is potentially considerably larger than $G$.
If there are $k$ waypoints, $G'$ will contain $2^k$ copies of $G$, plus some edges connecting them.