Use Optional Arguments in a Panels Path
My final solution was to create a Page Panel with the following path:

shop/%product/!optionalArgs


% indicates a required argument, ! indicates an optional argument

In order to grab all of the "arguments" or URL path after the product (ex: barn), go to Settings » Arguments, select Settings for optionalArgs, and make sure Get all arguments after this one is checked. Click Finish.

In order to use this with a Clean URL, the panel path needs to be some derivative of the Clean URL because panels does not have access to it. For more details, see merlinofchaos's explanation in the following Panels Issue: Panels, Pathauto and Arguments


  Let's say I have a url. It can be any URL, but for this example it's "node/12".
  
  Let's say I have an alias and it's generated by pathauto, and it's
  something like video/type/12/this-is-the-title-of-the-video and it's
  aliased to "node/12"
  
  If I visit
  http://example.com/video/type/12/this-is-the-title-of-the-video then
  what Drupal thinks the URL was was, in fact, 'node/12'. Panels never
  has a chance to do anything with video/type/12/foo because that URL
  doesn't really exist.
  
  The reason, then, that adding some other piece to the URL makes it
  work is that aliases don't accept arguments. They must be exact. So
  the problem, in that case, is the alias itself is actually taking the
  page away from where you want it to go.