First thing to check is that your hak is higher priority than any others in the module properties, and contains your custom 2da.
The portraits.2da should look something like this (where dots stand for the rows you're adding to) :
2DA V2.0
BaseResRef Sex Race InanimateType Plot LowGore
:
:
4111 trollop_ 1 6 **** 1 ****
4112 uncle_toby_ 0 6 **** 1 ****
4113 vampirebh_ 0 6 **** 1 ****
4114 zavazuma_ 0 6 **** 1 ****
4115 cat_bobtail_ 1 6 **** 1 ****
4116 guzzle_ 0 6 **** 1 ****
4117 panda_wiles_ 1 6 **** 1 ****
4118 cclaw_l_ 0 7 **** 1 ****
4119 cclaw_ 0 7 **** 1 ****
4120 COTBL_ 0 15 **** 1 ****
4121 gremlin_ 0 12 **** 1 ****
4122 zk_ 0 24 **** 1 ****
4123 ravenna_ 1 6 **** 0 ****
Best practice is to pad the 2da (i.e. no gaps in the line numbers), though I understand that only affects scripts that reference line numbers.
The plot flag is set for those playable race portraits that you don't want to see at character creation.
You'll need a set of tga files in 24 bit format for each portrait. For example, for uncle_toby_, the largest one will be named po_uncle_toby_h.tga. This must be 256 x 512 pixels, but only the top 256 x 400 pixels is used in game. You need four more images, each half the size of the one before, suffixed _l, _m, _s and _t respectively. The suffixes stand for huge, large, medium, small and tiny. You can omit the "huge" image if the portrait is not for PCs, and the "large" image if it is not for henchmen / companions / summoned creatures, but the other three must be present.
Hope this isn't motherhood, but any tiny deviation from the above cookbook results in failure, I find.