The problematic part of permalink structure you asking for is for permalinks like
/marketing-lists/{$something}/
where sometimes $something
should be a category, sometimes a page slug.
So, to make it works you should run a database query to know what $something
is and that will slow down performance
After that, if the url example.com/marketing-lists/viral-marketing
and you have a page with slug viral-marketing
and a category with slug viral-marketing
what WordPress should show, the page or the category archive?
Even if run a db query, you'll find a page and a category with that slug, so who win?
Moreover, using standard WordPress rewrite rules your work will be very hard... because a lot of conflict will happen.
I develop a plugin, Clever Rules can help you a lot for the task, but - again - with no db query is impossible say if the part just after /marketing-lists/
is a a page slug or a category...
Using that plugin this code should works, but it require a db query and in case of conflict the page slug will win:
/*
* Plugin Name: My Custom Rules
*/
add_action('plugins_loaded', 'register_my_rules');
add_filter('skip_clever_rule', 'rule_pages_for_pages', 20, 3);
function register_my_rules() {
if ( ! function_exists('register_clever_rule') ) return;
$args = array( 'id' => 'rule_pages','route' => '/marketing-lists/%s');
register_clever_rule( $args )->query('pagename=[0]')->priority(1);
$args = array( 'id' => 'rule_cats','route' => '/marketing-lists/%s');
register_clever_rule( $args )->query('category_name=[0]')->priority(2);
$args = array( 'id' => 'rule_singles','route' => '/marketing-lists/%s/%s/');
register_clever_rule( $args )->query('name=[1]');
}
function rule_pages_for_pages( $skip, $rule, $pieces ) {
if ( $rule['args']['id'] === 'rule_pages' ) {
global $wpdb;
$pages = $wpdb->get_col("SELECT post_name FROM $wpdb->posts WHERE post_type = 'page' AND post_status = 'publish'");
if ( ! in_array( $pieces[1], $pages ) ) $skip = true;
}
return $skip;
}
Note that that code goes in a plugin and can't work in themes.