Best way to organize data in this scenario

I vote for having two separate pages since this gives you all the power of permalinks that go directly to a specific video. That’s much better for you and your visitors since the content can be more easily shared.

From the codes perspective, you can apply DRY principles and still use a single-video.php and archive-video.php template. Have a look at the codex article about the get_template_part function that allows you to split your template into sub-parts.

For example you would create a file called video-top.php that displays the video on the top of the page and another file called video-list.php the is just part of a list of links to the other videos.

Then in the template single-video.php you would show the specific video at the top by including the template part and then afterwards a custom loop of the other videos but excluding that top video:

<?php

// the top video
if ( have_posts() ) {
    while ( have_posts() ) {
        get_template_part( 'video', 'top' ); // includes video-top.php 
    } // end while
} // end if

// The list of other videos
$video_query = new WP_Query( array( 'post_type' => 'video', 'post__not_in' => array( get_the_ID() ) ) );

if ( $video_query->have_posts() ) {
    echo '<ul>';
    while ( $video_query->have_posts() ) {
        $video_query->the_post();
        get_template_part( 'video', 'list' ); // includes video-top.php
    }
    echo '</ul>';
}
/* Restore original Post Data */
wp_reset_postdata(); ?>

The content of these files could be something like this:

<li><a href="https://wordpress.stackexchange.com/questions/185397/<?php echo get_permalink( get_the_ID() ) ?>"><?php the_title() ?></a></li>

And in video-top.php:

 <h1><?php the_title() ?></h1>
 <?php the_content() ?>

In archive-video.php your loop could look like this:

<?php

// the top video
if ( have_posts() ) {
    while ( have_posts() ) {
        if ( 0 == $current_post ) { // only runs for the first video
            get_template_part( 'video', 'top' ); // includes video-top.php
        } else {
            get_template_part( 'video', 'list' ); // includes video-list.php
        }
    } // end while
} // end if

$current_post is a global variable the is available during the loop and counts up for each post.