How can I display wp_link_pages before a shortcode, if it is used, or display after content?

Do something like this.

// your shortcode callback
function your_sc_callback($atts,$content) {
  $content = wp_list_pages(array('echo'=>false)).$content;
  define('YOUR_SC_RAN',true);
  return $content;
}

Now, in your theme template after the content prints

if (!defined('YOUR_SC_RAN')) {
  wp_list_pages();
}

Or, you could do …

function append_list_pages($content) {
  return $content.wp_list_pages(array('echo'=>false));
}
add_filter('the_content','append_list_pages',100);

And your shortcode callback would be …

function your_sc_callback($atts,$content) {
  $content = wp_list_pages(array('echo'=>false)).$content;
  remove_filter( 'the_content','append_list_pages',100 );
  return $content;
}

Both or these are untested, so no guarantees, but I think either should work.