pagination in a custom list created with get_pages function

I suggest using get_posts because you are able to set “paged” parameter there.

<?php

// Posts Per Page option
$ppp = 3;

// find out on which page are we
$paging =  isset( $_GET['list'] ) && ! empty( $_GET['list'] ) ? $_GET['list'] : 1 ;
// arguments for listed pages
$args = array(
    'posts_per_page' => $ppp,
    'post_type' => 'page',
    'paged' => $paging,
);

$pages = get_posts( $args );

if ( count( $pages ) > 0 ) {
    echo '<ul>';
    foreach ( $pages as $post ) {
        // http://codex.wordpress.org/Function_Reference/setup_postdata
        setup_postdata($post);
        echo '<li><a href="'.get_permalink( $post->ID ).'">'.$post->post_title.'</a></li>';
    }
    echo '</ul>';
} else {
    echo '<p>No pages!</p>';
}

$args = array(
    // set arguments for your pages here as well but be aware some parameters are different! http://codex.wordpress.org/Function_Reference/get_pages
    // or you can use http://codex.wordpress.org/Template_Tags/get_posts instead and exclude the "paged" argument
);

// how many pages do we need?
$count_pages = ceil( count( get_pages($args) ) / $ppp );

// display the navigation
if ( $count_pages > 0 ) {
    echo '<div>';
    for ($i = 1; $i <= $count_pages; $i++) {
        $separator = ( $i < $count_pages ) ? ' | ' : '';
        // http://codex.wordpress.org/Function_Reference/add_query_arg
        $url_args = add_query_arg( 'list', $i );
        echo  "<a href="$url_args">Page $i</a>".$separator;
    }
    echo '</div>';
}

// http://codex.wordpress.org/Function_Reference/wp_reset_postdata
wp_reset_postdata();

?>