Its actually bit difficult to test or observe memory use for class objects. I do hope you are right that their definition counts just once. Only what i observed was that adding 2 simple setter procedures to the TParticle class, added program memory by tens of thousands of bytes.
program memory? What does program memory (read: .exe size) have to do with it?
In two or three messages, speed, data memory and program memory have surfaced. Now, what exactly is the metric that is the important one? And no, smaller .exe is not necessarily faster.
I know that 10000 particles would still work smoothly with class objects but for game programming every bit is important. It could mean a little framerate loss or time that could be used in calculating physics or something else. Even if you aim to make an engine that wouldn't require a top notch year 2011 computer, but work on a little older computers too.
Such bits are not as black and white as you might think. There are many, many tunable variables.
When i delete a particle it does just this, moves last index in place of removed index, and that only works if i go the array through from "pCount-1 downto 0":
if a<=0 then begin // a is particle transparency channel
dec(pCount); pt[i]:=pt[pCount];
end;
For instance, the performance of this example depends on if the [] operator is a simple array access, or some property that calls a procedure (like in tlist).
So take a step back, and start describing the most speed dependent parts as abstract as possible.
By the way, is that even beneficial for the dynamic memory manager or should i just increase it in like steps of 500 each time? It would at least count it way faster without need for logarithm functions. I mean, it just struck me 1 day that powers of 2 might feel "computer friendly numbers" 
Small blocks are handled by the memory manager, it allocates a large block (think 1,2MB) from the OS, and then suballocates itself. Larger allocations are done directly from the OS.
FAllocation from the OS goes in pages. Pages are typically 4096 byte on 32-bit and iirc 8192 on 64-bit, but in there are options to make them larger (64kb or a 1 MB) in situations with a lots, lots of memory.
BUT, these blocks might contain a bit of overhead for the heapmanager, so allocating a multiple of the page size is not entirely ideal.
Anyway, in general the doubling is a good strategy, but only to a certain maximum. After that maximum is reached increasing with a large but fixed number is better.
If you only have one or a handful of these list (e.g. the list with particles) then take the maximum big (say 256kb or 1MB), and the increment after also large. If the list is not entirely full, it will only be hundreds of kbs or a few MB at best that are lost. Even 7 year old machines typically have hundreds of MBs of memory.
If you use a list e.g. inside the tparticle class, and every particle might have one, things are different. Both values are then small, since the slack (even if only a few thousand bytes) goes times the number of particles.