If you set node creation permission (Node Module on `www.yourhost.com/admin/user/permissions`) to specific roles, the existing form should take care of this automagically by itself, eg, if the user accessing `www.yourhost.com/node/add` can't create a specific node type, it won't be presented on that page.

Based upon commentary, `node/add` is built via:

    function node_add_page() {
      $item = menu_get_item();
      $content = system_admin_menu_block($item);
      return theme('node_add_list', $content);
    }   
        
    /** 
     * Display the list of available node types for node creation.
     *  
     * @ingroup themeable
     */ 
    function theme_node_add_list($content) {
      $output = '';
      
      if ($content) {
        $output = '<dl class="node-type-list">';
        foreach ($content as $item) {
          $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>';
          $output .= '<dd>'. filter_xss_admin($item['description']) .'</dd>';
        }
        $output .= '</dl>';
      } 
      return $output;
    } 

so you most certainly could create a new `YOURTHEME_node_add_list()` function that filters the links based upon a user's role realizing that if the user entered the link directly it would nonetheless still work.

You could also create a `node-add-list.tpl.php` in your theme's directory with basically this in it as a start:

    <?php
      
      $output='';

      if ($content) {
        $output = '<dl class="node-type-list lrfm-ed">';
        foreach ($content as $item) {
          $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>';
          $output .= '<dd>'. filter_xss_admin($item['description']) .'</dd>';
        }
        $output .= '</dl>';
      } 
      print $output;

and then modify it however you wanted.

Just flush caches after either to make drupal's theme system see and pick up the changes.