Override custom module template
What you describe is something that Drupal core already does. Take as example the Node module; it defines its own template file (node.tpl.php) that is then overridden from themes, such as the Bartik theme, with their own template file (in the case of the Bartik theme, with templates/node.tpl.php).

What is wrong in your implementation of hook_theme() is the name you give to the template file. Despite what it could seem, the template key doesn't allow to give the template name an arbitrary name; the name must match the theme name you are using, in your case mymodule_list. You can replace the underscores in the theme name with hyphens, but that is the only change you could do.  

See Override template files based on template filename as well as hook name, where the user suggesting the change says:


  Turns out the template file name needs to exactly match the array key used in hook_theme() (with the exception of dashes and underscores). In the case of my example, the template value would need to be my_abc_index and the file name my-abc-index.tpl.php. Failure to do so will result in an un-overridable template.


(I slightly changed formatting, and the spelling of a word.)

Also, as you see in the code used from Drupal core, the theme_ prefix in the the theme name is not necessary.

function node_theme() {
  return array(
    'node' =&gt; array(
      'render element' =&gt; 'elements',
      'template' =&gt; 'node',
    ),
    'node_search_admin' =&gt; array(
      'render element' =&gt; 'form',
    ),
    'node_add_list' =&gt; array(
      'variables' =&gt; array('content' =&gt; NULL),
      'file' =&gt; 'node.pages.inc',
    ),
    'node_preview' =&gt; array(
      'variables' =&gt; array('node' =&gt; NULL),
      'file' =&gt; 'node.pages.inc',
    ),
    'node_admin_overview' =&gt; array(
      'variables' =&gt; array('name' =&gt; NULL, 'type' =&gt; NULL),
      'file' =&gt; 'content_types.inc',
    ),
    'node_recent_block' =&gt; array(
      'variables' =&gt; array('nodes' =&gt; NULL),
    ),
    'node_recent_content' =&gt; array(
      'variables' =&gt; array('node' =&gt; NULL),
    ),
  );
}