Block configuration per region
If you just need the functionality, you can try MultiBlock to see if it fits your needs: 

"Each block has a 1:1 relationship with its region, weight, visibility (and other) settings. This means that it is impossible to have blocks in multiple regions or to have blocks that have different settings on different pages. MultiBlock module solves this problem by allowing you to create multiple Block Instances of already existing blocks."

However, you question is about being able to accomplish building a module that manages this. So, yes, I recently did something similar. I needed a homepage with blocks displaying a list of articles, each one with custom options (e.g. different categories, with / without images, etc.) and also in different regions across the site. I created one module, and then instead of having each block with a harcoded-fixed name, I generate the block's names ($delta) dynamically, like this:

function MY_BLOCK_block_info() {
  // Instead of having a static number of blocks, let's choose how many
  // we want, via the administration.
  $blocks_qty = variable_get('MY_BLOCK_blocks_qty');
  for($i = 1; $i &lt;= $blocks_qty; $i++) {
    $blocks['MY_BLOCK-' . $i] = array(
      'info' =&gt; t('My block ' . $i), 
      'cache' =&gt; DRUPAL_CACHE_PER_ROLE,
      'region' =&gt; BLOCK_REGION_NONE,
    );
  }
  return $blocks;
}


Then you will have different names for each block (MY_BLOCK-1, MY_BLOCK-2, etc). So you can individually configure them like this:

function MY_BLOCK_block_configure($delta = '') {
  $form = array();
  $parts = explode('-', $delta); 
  $block_number = $parts[1];

  // Your form here...
  $form['MY_BLOCK_' . $block_number . '_title'] = array( ...


So, in the general Configuration page you get to choose how many blocks you want to generate. And then, in the individual block's configuration page you choose the individual block's settings.