If you're already using liblo (which is a great library BTW), you don't need oscpack. They both work with OSC.
I think you're missing some understanding on the fundamentals of OSC. An OSC message has an address and a number of arguments, so a "list" in OSC will just be a message with that number of arguments. To read them out in C++ with liblo (or pretty much any other OSC library), you get the message and check that the address is what you expect, check the number of arguments, and for each argument, you check the type (int, float, stirring, etc), and then pull the actual value as the type you want out. Basically something like this in pseudo C++ :
if (message.address == "/expected/path" ){
vector<float> list;
for( int i = 0; i < message.numArguments; ++i) {
if (message.argumentType(i) == FLOAT) {
list.push_back(message.argumentAsFloat(i))
}
}
liblo is a C library and what I wrote above is more applicable to oscpack which uses classes, but the liblo function calls do exactly the same thing. Also, you can check agains the type string as well which has 1 char per type aka sending a message for pd like "/hello" 1.2 2.3 4.5 will have the types string of "fff" for 3 float arguments.