What you outline here is good IMHO. I’ve shipped 3 projects in which the player can at-will possess multiple pawns throughout every game mode:
PlayerController: represents the player’s will, key bindings are here to generalized functions like MoveLeft(), MoveRight(), etc. Always has a reference to the Pawn currently being controlled. A MoveLeft() command to the PlayerController relays a MoveLeft() command to the currently possessed Pawn.
Character: each Character/Pawn has its own implementation MoveLeft(), MoveRight(), etc. extending from a base class (or interface). So the player can control a soldier, tank, or UAV and the commands to the pawn are always the same interface.
Result: key bindings are conveniently all in one place and you can control any type of pawn.