As it says you're using C++ then I'd use:
void do_something( TCHAR (&a)[ 3 ][ 32 ] )
{
}
over
void do_something( TCHAR a[][ 32 ] )
{
}
or
void do_something( TCHAR (*a)[32] )
{
}
as this avoids the C style decay of arrays to pointers. It won't stop you blowing the array bounds but it means you know the size of the array inside the function and write safer code.
As an alternative instead of using a 2D array why not use a vector of strings?
void do_something( std::vector<std::basic_string<TCHAR>> &strings )
{
}
It's a bit easier to use and you don't have to muck about with low level guff like pointers and built in array. Or as you've called the thing a string list would a list be more appropriate?
void do_something( std::list<std::basic_string<TCHAR>> &string_list )
{
}
Cheers,
Ash