custom post types shortode stays on top of other page contents. Is there a bug?

You have this code in your shortcode function:

if( count($posts) ):
        echo '<ul id="portfolio-grid" class="portfolio-grid unstyled '.$post_columns.'-cols">';
        foreach( $posts as $post ) : setup_postdata( $post );
        ?>
        <li>
            <a href="https://wordpress.stackexchange.com/questions/104016/<?php the_permalink(); ?>" data-largesrc="<?php if ( has_post_thumbnail() ) { echo ub_featured_img_url('portfolio-fullsize'); } else { ?>http://placehold.it/600&text=<?php _e('No Thumbnails', 'une_boutique'); } ?>" data-title="<?php the_title() ?>" data-button="<?php _e('View Project', 'une_boutique'); ?>" data-description="<?php the_excerpt() ?>">
                <?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } else { ?>
                <img src="http://placehold.it/320&text=<?php _e('No Thumbnails', 'une_boutique'); ?>" alt="no thumbnails">
                <?php } ?>
            <span class="item-title"><span class="arrow-shape-up"></span><?php the_title() ?></span>
            </a>
        </li>
        <?php
        endforeach; wp_reset_postdata();
        echo '</ul>';
    endif;

Shortcodes should return their content.
Change this part into something like this:

if( count($posts) ):
  ob_start();

  echo '<ul id="portfolio-grid" class="portfolio-grid unstyled '.$post_columns.'-cols">';
        foreach( $posts as $post ) : setup_postdata( $post );
        ?>
        <li>
            <a href="https://wordpress.stackexchange.com/questions/104016/<?php the_permalink(); ?>" data-largesrc="<?php if ( has_post_thumbnail() ) { echo ub_featured_img_url('portfolio-fullsize'); } else { ?>http://placehold.it/600&text=<?php _e('No Thumbnails', 'une_boutique'); } ?>" data-title="<?php the_title() ?>" data-button="<?php _e('View Project', 'une_boutique'); ?>" data-description="<?php the_excerpt() ?>">
                <?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } else { ?>
                <img src="http://placehold.it/320&text=<?php _e('No Thumbnails', 'une_boutique'); ?>" alt="no thumbnails">
                <?php } ?>
            <span class="item-title"><span class="arrow-shape-up"></span><?php the_title() ?></span>
            </a>
        </li>
        <?php
        endforeach; wp_reset_postdata();
        echo '</ul>';

  return ob_get_clean();
endif;