When you create a project using any of the available project templates Player Controller instances are created in a game automatically according on what those templates set internally (settings that you can change). If you want to spawn a character, usually that character has a setting telling which player controller will be used, if it is an AI character, you can set it as AIController.
Sometimes when coding a game, being in C++ or Blueprints, some nodes that do actions on a character or a pawn, needs to know as input which is the player controller, and those nodes has this functionality, return a reference to an instance of a player controller which is in use by that character or pawn.
Once you start checking some game code and coding yourself, it will be easier to understand. Getting hands dirty coding sometimes are the easiest way to understand how things works.
PS: your questions got answered already by what several people have answered already. Your main issue is understand the classes hierarchy inside Unreal and what is automatically instanced for you: World, GameInstance, GameMode, PlayerController, etc