Display gallery on bottom after content

This is not bulletproof, but should work perfectly fine in most cases:

class WPSE_105676_Gallery_First {
    private static $_gallery = '',
                   $_handler;

    public static function gallery( $attr ) {
        self::$_gallery .= is_callable( self::$_handler ) ? call_user_func( self::$_handler, $attr ) : '';
        return '';
    }

    public static function content( $text ) {
        $text .= self::$_gallery;
        self::$_gallery = '';
        return $text;
    }

    public static function startup() {
        if ( ! isset( self::$_handler ) ) {
            if ( empty( $GLOBALS['shortcode_tags']['gallery'] ) || ! self::$_handler = $GLOBALS['shortcode_tags']['gallery'] )
                self::$_handler="gallery_shortcode";

            add_shortcode( 'gallery', array( __class__, 'gallery' ) );
        }

        add_filter( 'the_content', array( __class__, 'content' ), 1000 );
    }
}

add_action( 'init', array( 'WPSE_105676_Gallery_First', 'startup' ), 100 );

In layman’s terms, in startup() we save the current shortcode handler for gallery (so this should also work with plugins & themes that override the default), then replace it with our own gallery() method. This is where we “capture” the gallery & return an empty string, so it no longer appears where the shortcode existed.

Out content() method is hooked to the_content on a low-priority filter to ensure it runs after all shortcode has been parsed, plus any other filters that might add their own content. This appends the captured gallery, resets the property, and returns the post content.