How to handle a missing page.php?

The only required template in a WordPress theme is the index.php. And a comments.php if comments are supported. Following the template hierarchy, all other files, including page.php, will fall back to the index.php.

When a theme doesn’t have a page.php, look at the index.php. There you will find the basic structure for its content. In your example, the index.php looks like this:

<?php get_header(); // Loads the header.php template. ?>

<main <?php hybrid_attr( 'content' ); ?>>

    <?php if ( !is_front_page() && !is_singular() && !is_404() ) : // If viewing a multi-post page ?>

        <?php locate_template( array( 'misc/loop-meta.php' ), true ); // Loads the misc/loop-meta.php template. ?>

    <?php endif; // End check for multi-post page. ?>

    <?php if ( have_posts() ) : // Checks if any posts were found. ?>

        <?php while ( have_posts() ) : // Begins the loop through found posts. ?>

            <?php the_post(); // Loads the post data. ?>

            <?php hybrid_get_content_template(); // Loads the content/*.php template. ?>

            <?php if ( is_singular() ) : // If viewing a single post/page/CPT. ?>

                <?php comments_template( '', true ); // Loads the comments.php template. ?>

            <?php endif; // End check for single post. ?>

        <?php endwhile; // End found posts loop. ?>

        <?php locate_template( array( 'misc/loop-nav.php' ), true ); // Loads the misc/loop-nav.php template. ?>

    <?php else : // If no posts were found. ?>

        <?php locate_template( array( 'content/error.php' ), true ); // Loads the content/error.php template. ?>

    <?php endif; // End check for posts. ?>

</main><!-- #content -->

<?php get_footer(); // Loads the footer.php template. ?>

You can strip all multi-post related code and the comments template call. And the unnecessary PHP tags and comments (sigh). That leaves this:

<?php get_header(); ?>

<main <?php hybrid_attr( 'content' ); ?>>

    <?php 
    if ( have_posts() )
    {
        while ( have_posts() )
        {
            the_post();
            hybrid_get_content_template();
        }

        locate_template( array( 'misc/loop-nav.php' ), true ); 
    }
    ?>
</main>

<?php get_footer();

That makes a nice readable page.php. You can now replace hybrid_get_content_template(); with woocommerce_content(); or whatever the plugin needs.

But wait! Do not change the theme, create a child theme instead and put your changes into that. Now you can still update the parent theme without losing your customizations.

You can follow these steps with every theme and every plugin. If the index.php works, you can use it to create new templates in a child theme.