Add an extra delivery address
The customer information is stored as commerce_customer entity. By default it has an address field attached to it. For multiple addresses, you could either allow multiple values on the field, and use some theming to display one as billing and the other as delivery.

The other option would be to add a new address field and use that for delivery/billing. With hook_form_alter you could add custom elements to the form, like the checkbox and JavaScript effects.

You have a few options if you want to customize your address field form. You can implement AddressFieldForm, the default looks like this:

/**
 * Default address handler.
 */
class AddressFieldForm_default implements AddressFieldForm {
  public function form($address, $field, $instance, $langcode, $items, $delta, $element) {
    $required = $delta == 0 &amp;&amp; $instance['required'];

    $form['thoroughfare'] = array(
      '#title' =&gt; t('Street'),
      '#type' =&gt; 'textfield',
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['thoroughfare'],
    );
    $form['premise'] = array(
      '#title' =&gt; t('Residence, building, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['premise'],
    );
    $form['sub_premise'] = array(
      '#title' =&gt; t('Floor, stairway, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['sub_premise'],
    );
    $form['dependent_locality'] = array(
      '#title' =&gt; t('Suburb, post box, ...'),
      '#type' =&gt; 'textfield',
      '#default_value' =&gt; $address['dependent_locality'],
    );
    $form['postal_code'] = array(
      '#title' =&gt; t('Postal Code'),
      '#type' =&gt; 'textfield',
      '#size' =&gt; 5,
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['postal_code'],
    );
    $form['locality'] = array(
      '#title' =&gt; t('City'),
      '#type' =&gt; 'textfield',
      '#size' =&gt; 30,
      '#required' =&gt; $required,
      '#default_value' =&gt; $address['locality'],
    );

    // All the other fields are unsupported by this handler.
    foreach (array('administrative_area', 'sub_administrative_area') as $field) {
      $form[$field] = array(
        '#type' =&gt; 'value',
        '#value' =&gt; '',
      );
    }
    return $form;
  }
}


This is what addressfield uses to internally handle different address types. Using addressfield_mapping_alter you would be able to overwrite the default mapping, or create a mapping for your own country:

function module_addressfield_mapping_alter(&amp;$mapping) {
  $mapping['default'] = 'AddressFieldForm_my_custom_default_form',
  $mapping['DK'] = 'AddressFieldForm_dk', // Add for Denmark which doesn't exist yet
}


In addition to this, you have all the usual tools, like hook_form_alter and adding a custom theme function to render the form like you which. You should be aware that addressfield makes heavy use of AJAX to replace form elements when changing country.