Distributing and packaging plugins

Well, not quite sure if I understood this, but I see that you want to ‘simulate’ pages using a plugin, and my best bet is to build your own posts on-the-fly using WordPress queries and rewrite rules. Let’s try this:

Create a variable to respond to your view.

add_action( 'query_vars', 'add_query_vars' );
function add_query_vars( $vars ) {
    array_push( $vars, 'form_id' );
    return $vars;
}

Create a rewrite rule to fill this variable:

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array(
        'forms/([^/]+)/?$' => 'index.php?form_id=$matches[1]'
    );
    return $new_rules + $rules;
}

Now, visit your site’s options-permalink.php page to flush the rules and make the above one valid (http://yourdevsite.com/wp-admin/options-permalink.php).

You’ll be able to access custom URLs like http://yourdevsite.com/forms/some-form or the equivalent http://yourdevsite.com/?form_id=some-form.

Now, as in WordPress we can’t suppress the main query, let’s just override it when a matching form_id occurs:

add_action( 'wp', 'custom_wp_query' );
function custom_wp_query( $wp ) {

    // Don't do anything for other queries
    if ( ! $form_id = get_query_var('form_id') )
        return false;

    global $wp_query;

    // Let's respond this request with this function
    $func="form_" . str_replace( '-', '_', $form_id );

    // Throw a 404 if there's no function to deal with this request
    if ( ! function_exists( $func ) ) {
        $wp_query->is_404 = true;
        return false;
    }

    // Set as a valid query for this case
    $wp_query->is_404 = false;
    $wp_query->is_single = true;
    $wp_query->found_posts = 1;

    // Call the function
    $post = call_user_func( $func );

    // Stick this post into the query
    $wp_query->posts = array( $post );
    $wp_query->post = $post;

}

And finally create your post:

function form_some_form() {
    return (object) array(

        // Put a negative ID as they don't exist
        'ID' => rand() * -1,

        // What matters for us
        'post_title' => 'Form title',
        'post_content' => 'Some post content (the form itself, presumably)',

        // It is important to maintain the same URL structure of 'add_rewrite_rules',
        // otherwise wrong links will be displayed in the template
        'post_name' => 'forms/' . get_query_var( 'form_id' ),
        'post_guid' => home_url( '?form_id=' . get_query_var( 'form_id' ) ),

        // Admin
        'post_author' => 1,

        // Straighforward stuff
        'post_date' => date( 'mysql' ),
        'post_date_gmt' => date( 'mysql' ),
        'post_status' => 'publish',
        'post_type' => 'page',
        'comment_status' => 'closed',
        'ping_status' => 'closed'
    );
}

So, if you want now to create more ‘custom pages’ for — let’s say — a form with a some-other-form URL, just create a function named form_some_other_form just like form_some_form.

Obviously, the edit link won’t work as will send you to an nonexistent post in admin.

And for the menus, as you ask, I suggest inserting these pages as custom links.