You would call:
add_meta_box( $widget_id, $widget_name, $callback, $screen->id, $location, $priority );
Where the screen ID is obtained via:
$screen = get_current_screen();
Then display each location e.g. :
do_meta_boxes( $screen->id, 'column3', '' );
Here's the dashboard function that displays the dashboard:
function wp_dashboard() {
global $screen_layout_columns;
$screen = get_current_screen();
$hide2 = $hide3 = $hide4 = '';
switch ( $screen_layout_columns ) {
case 4:
$width = 'width:24.5%;';
break;
case 3:
$width = 'width:32.67%;';
$hide4 = 'display:none;';
break;
case 2:
$width = 'width:49%;';
$hide3 = $hide4 = 'display:none;';
break;
default:
$width = 'width:98%;';
$hide2 = $hide3 = $hide4 = 'display:none;';
}
?>
<div id="dashboard-widgets" class="metabox-holder">
<?php
echo "\t<div class='postbox-container' style='$width'>\n";
do_meta_boxes( $screen->id, 'normal', '' );
echo "\t</div><div class='postbox-container' style='{$hide2}$width'>\n";
do_meta_boxes( $screen->id, 'side', '' );
echo "\t</div><div class='postbox-container' style='{$hide3}$width'>\n";
do_meta_boxes( $screen->id, 'column3', '' );
echo "\t</div><div class='postbox-container' style='{$hide4}$width'>\n";
do_meta_boxes( $screen->id, 'column4', '' );
?>
</div></div>
<form style="display:none" method="get" action="">
<p>
<?php
wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
?>
</p>
</form>
<?php
}
For further reference, look at wp-admin/index.php and the included dashboard files.