From OuroDev

First it is very important to realize that NPC as a commonly used term and the .NPC file are not the same thing. An NPC (for those not familiar with gaming is a Non-Player Character) and so the term can be used to define a whole bunch of characters who are not the player. Pretty much any alternate term you can think of is *also* being used for a file type so lets move forward and keep referring to them as NPC or Critters. There is also a .Critter file so we have the same problem regardless.
Every contact in the game has .NPC and a .Contact file, for example. However not every NPC has a .Contact file as not all of them are contacts many of them are simply NPC who inhabit city zones. Also not every contact is a contact as a player would think of them.

You will also find frequent files which have NPC earlier in the file name these are using NPC to mean non-player character rather then .NPC file.
The .npc file is needed to do things like hold the appearance, connect with the .contact file if any, hold VisionPhases, provide display name, and what kind of stance/animation they may be using. i.e. StandStill is the most common. This is also where you can do a few other more advanced things that are less common.
This is an example of a .NPC file
// NPC: Reese
NPCDef Reese
Model Model_Reese
Contact Contacts/Praetoria/Nova_Praetoria/
VisionPhases NoPrime, AliveContact4
AI PL_StandStill
DisplayName "P4292860590"