Dynamic allocations usually means that the object should have a programmatically controlled lifetime. That means that when using pointers and dynamic allocation, you are now in control of when the object is created and destroyed in the program instead of the usualy scoped lifetimes.
Adding unneeded levels of indirections can be harmful while not adding anything useful to your program. It may also have a maintenace cost and a performance cost and in some cases a security cost.
But this can be useful in certain cases, where you actually need that level of indirection. For example, some part of a program may watching a collection for new values and another part is adding new values in it. You need to share the resource and the answer might be pointers and dynamic allocations.
Even then, I would dynamically allocate a class that contains the collection instead of the collection directly. A class with a name and operations convey meaning and exposes precise operations. A simple vector is much more generic and it's meaning must be derived from the code that uses it.
The other reason why it is not usually dynamically allocated is that the only property we need when using collections is their values. The elements inside it, not the identity of the collection itself.