When I design my system from scratch, I often face a dilemma whether my object should push information into another objects OR whether the objects should
destination.Push(source)
source.Pull(destination)
Select your solution by looking at the dependencies you want to have in your code.
If Source and Destination cannot depend on what's needed for the previous scheme, then you need the action to be performed by an external method that knows (depends on) both Source and Destination. It only has public access to both though.
If you need any virtual ISource to feed any IDestination then you need those interfaces to expose all the methods needed for an external method to perform the action.
If a single external method cannot perform the action on any ISource and any IDestination, then you might want to look at the Visitor pattern, the Visitor class performing all the particular actions on the specific Source1 and SourceX Destination1 and DestinationY.