2 added code
source | link

A possible solution would be to create your own meta box that lists templates from your own array of templates appropriate for the current page, and save the choice as post meta. Then add a filter to page_template to check for that meta value and load that template:.

EDIT- here's a full working example with code adapted from the add_meta_box codex page. The only thing you'll have to change is the $wpa70686_custom_templates array. The format is the page ID you'd like to make the templates available for, then within those arrays, the filename (minus .php), and the name that's displayed in the dropdown menu.

// page ID, template filename, template display name
$wpa70686_custom_templates = array(
    42 => array(
        'custom1' => 'Custom Template One',
        'custom2' => 'Custom Template Two',
    ),
    96 => array(
        'custom3' => 'Custom Template Three',
        'custom4' => 'Custom Template Four',
    )
);

// add the meta box
add_action( 'add_meta_boxes', 'wpa70686_add_template_box' );

function wpa70686_add_template_box() {
    add_meta_box(
        'wpa70686_template_box',
        'Page Template', 
        'wpa70686_render_template_box',
        'page',
        'side'
    );
}

// display the meta box on the apprpriate pages
function wpa70686_render_template_box( $post ) {
    global $wpa70686_custom_templates;
    wp_nonce_field( 'wpa70686_nonce', 'wpa70686_noncename' );

    if( array_key_exists( $post->ID, $wpa70686_custom_templates ) ) :

        $current_value = get_post_meta( $post->ID, '_wpa70686_template', TRUE );

        echo '<select id="wpa70686_template_box" name="wpa70686_template_box">';
        echo '<option value="default">Default</option>';

        foreach( $wpa70686_custom_templates[$post->ID] as $template_file => $template_name ):

            $selected = $current_value == $template_file ? ' selected' : '';
            echo '<option value="' . $template_file . '"' . $selected . '>' .$template_name . '</option>';

        endforeach;

        echo '</select>';

    else:
        echo 'no templates for this page';
    endif;
}

// save the meta box value if it exists
add_action( 'save_post', 'wpa70686_save_template_box' );

function wpa70686_save_template_box( $post_id ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

    if ( !wp_verify_nonce( $_POST['wpa70686_noncename'], 'wpa70686_nonce' ) ) return;

    if ( 'page' == $_POST['post_type'] ){
        if ( !current_user_can( 'edit_page', $post_id ) ) return;
    } else {
        if ( !current_user_can( 'edit_post', $post_id ) ) return;
    }

    if( isset( $_POST['wpa70686_template_box'] ) ):

        $new_value = $_POST['wpa70686_template_box'];
        $current_value = get_post_meta( $post_id, '_wpa70686_template', true );

        if( $current_value ):

            if( 'default' == $new_value ):
                delete_post_meta( $post_id, '_wpa70686_template' );
            else:
                update_post_meta( $post_id, '_wpa70686_template', $new_value );
            endif;

        else:

            add_post_meta( $post_id, '_wpa70686_template', $new_value, true );

        endif;
    endif;

}

// load the custom template for pages with the meta value set
add_filter( 'page_template', 'wpa70686_custom_template' );

function wpa70686_custom_template(){
    global $wp_query;
    if ( $template = get_post_meta( $wp_query->queried_object_id, 'custom_template''_wpa70686_template', true ) )
        return locate_template( $template . '.php' );
}

A possible solution would be to create your own meta box that lists templates from your own array of templates appropriate for the current page, and save the choice as post meta. Then add a filter to page_template to check for that meta value and load that template:

add_filter( 'page_template', 'wpa70686_custom_template' );

function wpa70686_custom_template(){
    global $wp_query;
    if ( $template = get_post_meta( $wp_query->queried_object_id, 'custom_template', true ) )
        return locate_template( $template . '.php' );
}

A possible solution would be to create your own meta box that lists templates from your own array of templates appropriate for the current page, and save the choice as post meta. Then add a filter to page_template to check for that meta value and load that template.

EDIT- here's a full working example with code adapted from the add_meta_box codex page. The only thing you'll have to change is the $wpa70686_custom_templates array. The format is the page ID you'd like to make the templates available for, then within those arrays, the filename (minus .php), and the name that's displayed in the dropdown menu.

// page ID, template filename, template display name
$wpa70686_custom_templates = array(
    42 => array(
        'custom1' => 'Custom Template One',
        'custom2' => 'Custom Template Two',
    ),
    96 => array(
        'custom3' => 'Custom Template Three',
        'custom4' => 'Custom Template Four',
    )
);

// add the meta box
add_action( 'add_meta_boxes', 'wpa70686_add_template_box' );

function wpa70686_add_template_box() {
    add_meta_box(
        'wpa70686_template_box',
        'Page Template', 
        'wpa70686_render_template_box',
        'page',
        'side'
    );
}

// display the meta box on the apprpriate pages
function wpa70686_render_template_box( $post ) {
    global $wpa70686_custom_templates;
    wp_nonce_field( 'wpa70686_nonce', 'wpa70686_noncename' );

    if( array_key_exists( $post->ID, $wpa70686_custom_templates ) ) :

        $current_value = get_post_meta( $post->ID, '_wpa70686_template', TRUE );

        echo '<select id="wpa70686_template_box" name="wpa70686_template_box">';
        echo '<option value="default">Default</option>';

        foreach( $wpa70686_custom_templates[$post->ID] as $template_file => $template_name ):

            $selected = $current_value == $template_file ? ' selected' : '';
            echo '<option value="' . $template_file . '"' . $selected . '>' .$template_name . '</option>';

        endforeach;

        echo '</select>';

    else:
        echo 'no templates for this page';
    endif;
}

// save the meta box value if it exists
add_action( 'save_post', 'wpa70686_save_template_box' );

function wpa70686_save_template_box( $post_id ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

    if ( !wp_verify_nonce( $_POST['wpa70686_noncename'], 'wpa70686_nonce' ) ) return;

    if ( 'page' == $_POST['post_type'] ){
        if ( !current_user_can( 'edit_page', $post_id ) ) return;
    } else {
        if ( !current_user_can( 'edit_post', $post_id ) ) return;
    }

    if( isset( $_POST['wpa70686_template_box'] ) ):

        $new_value = $_POST['wpa70686_template_box'];
        $current_value = get_post_meta( $post_id, '_wpa70686_template', true );

        if( $current_value ):

            if( 'default' == $new_value ):
                delete_post_meta( $post_id, '_wpa70686_template' );
            else:
                update_post_meta( $post_id, '_wpa70686_template', $new_value );
            endif;

        else:

            add_post_meta( $post_id, '_wpa70686_template', $new_value, true );

        endif;
    endif;

}

// load the custom template for pages with the meta value set
add_filter( 'page_template', 'wpa70686_custom_template' );

function wpa70686_custom_template(){
    global $wp_query;
    if ( $template = get_post_meta( $wp_query->queried_object_id, '_wpa70686_template', true ) )
        return locate_template( $template . '.php' );
}
1
source | link

The short answer: there isn't a way to control what shows up in that dropdown list, there are no filters available for it. Hopefully that will change in a future version.

A possible solution would be to create your own meta box that lists templates from your own array of templates appropriate for the current page, and save the choice as post meta. Then add a filter to page_template to check for that meta value and load that template:

add_filter( 'page_template', 'wpa70686_custom_template' );

function wpa70686_custom_template(){
    global $wp_query;
    if ( $template = get_post_meta( $wp_query->queried_object_id, 'custom_template', true ) )
        return locate_template( $template . '.php' );
}