Shortcode returns values in the wrong order

it is b/c wp_list_pages ECHOES by default. so it echoes before your return happens.

wherever you are defining your $args, set

‘echo’ => FALSE,

see
http://codex.wordpress.org/Function_Reference/wp_list_pages