From my experience, clean and efficient way to do that was that each component use different controllers, however, if there was a method which should work the same, such as yours GetList I would write that specific method in inherited controller like GenericController and call it from all controllers.
That way I would have best of both worlds, from one side one time written logic and just called when needed, but on the another, able to do additional logic in future.
If you want to have one main controller