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="<?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.